//
//  YZGListDataManager.h
//  sisitv_ios
//
//  Created by apple on 17/2/27.
//  Copyright © 2017年 JLXX--YZG. All rights reserved.
//

#import <Foundation/Foundation.h>

#define kJLXXSafeBlock(block,param) \
if (block) { \
if ([NSThread isMainThread]) { \
block(param); \
} else { \
dispatch_async(dispatch_get_main_queue(), ^{ \
block(param); \
}); \
} \
}

typedef void(^YZGListDataManagerRequestSuccess) (id result);
typedef void(^YZGListDataManagerRrequestFaile) (NSString *errorString);

@class YZGRequest,YZGListDataManager;

@protocol YZGListDataManagerDelegate <NSObject>

@required
- (void)refreshNewSuccess:(YZGListDataManager *)listDataManager;
- (void)loadMoreSuccess:(YZGListDataManager *)listDataManager;
/**
 请求结束后的操作，刷新tableview或关闭动画等。
 */
- (void)requestFinishedSuccess:(YZGListDataManager *)listDataManager;
/**
 请求失败后的操作
 */
- (void)requestFinishedFaile:(YZGListDataManager *)listDataManager;

@optional

- (void)didLoadFirstPage:(YZGListDataManager *)listDataManager;
- (void)didLoadLastPage:(YZGListDataManager *)listDataManager;

@end

@interface YZGListDataManager : NSObject

@property (nonatomic, weak) id<YZGListDataManagerDelegate> delegate;
/**
 网络请求
 */
@property (nonatomic,strong) YZGRequest *netRequest;
/**
 多个网络请求的数组,网络请求成功(失败)后,统一处理回调(代理)事件
 如果batchRequests的个数不为0,则netRequest 失效
 */
@property (nonatomic , strong) NSArray< YZGRequest *> *batchRequests;
/**
 如果为是，表示刷新，否则为加载更多。
 */
@property (nonatomic, assign) BOOL isRefresh;
/**
 是否需要加载更多选项
 */
@property (nonatomic, assign) BOOL isNeedLoadMore;

/**
 下拉刷新
 */
- (void)pullDownToRefresh;
/**
 加载更多
 */
- (void)pullUpToLoadMore;
/**
 如果请求出错,若为服务器出错,或者当前网络有问题导致的超时,则为YES
 */
@property (nonatomic, getter=isNetworkError) BOOL networkError;
/**
 netRequest请求获得的模型数组(baseItem及其子类)
 */
@property (nonatomic , strong) NSMutableArray *responseObject;
/**
 处理netRequset请求,从服务器获得的数据,转为模型
 
 @param responseObject responseObject
 */
-(void)parseServerData:(NSDictionary *)responseObject;
/**
 初始化
 
 @param delegate delegate
 @return 返回实例
 */
-(instancetype)initWithDelegate:(id<YZGListDataManagerDelegate>)delegate;

@end
